#include "bsp_led.h" 
#include "systick.h"
#include "stm32f10x.h"
#include "bsp_key.h"
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;                /*定义GPIO_InitStructure类型结构体*/
	  RCC_APB2PeriphClockCmd( LED_BLU_GPIO_CLK | LED_RED_GPIO_CLK | LED_GRE_GPIO_CLK | LED_WHI_GPIO_CLK, ENABLE);  /*开启已经定义的LED_BLU的相关GPIO外设时钟*/
	  GPIO_InitStructure.GPIO_Pin = LED_BLU_GPIO_PIN | LED_RED_GPIO_PIN | LED_GRE_GPIO_PIN | LED_WHI_GPIO_PIN;     /*选择要控制的LED_BLU_GPIO_PIN引脚*/
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    /*设置引脚模式为推挽输出*/
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   /*设置引脚速率为50Mhz*/
	  GPIO_Init(LED_BLU_GPIO_PORT, &GPIO_InitStructure);  /*调用库函数，初始化GPIO*/
    GPIO_Init(LED_RED_GPIO_PORT, &GPIO_InitStructure);
    GPIO_Init(LED_GRE_GPIO_PORT, &GPIO_InitStructure);
    GPIO_Init(LED_WHI_GPIO_PORT, &GPIO_InitStructure);	
    LED_BLU_OFF();                                     /*关闭LED,使其初始状态为OFF*/
    LED_RED_OFF();
    LED_GRE_OFF();
    LED_WHI_OFF();   
}



void LED_Task(void)
{
   static uint8_t effect = 1;
   static uint32_t systick_count = 0;


	 switch(effect)
	{
		case 1:   // 流水灯效果：四个LED依次点亮并熄灭
	        
            LED_BLU_ON();
            SysTick_Delay_Nms(300);
            LED_BLU_OFF();
           
            LED_WHI_ON();
            SysTick_Delay_Nms(300);
            LED_WHI_OFF();

            LED_RED_ON();
            SysTick_Delay_Nms(300);
            LED_RED_OFF();

            LED_GRE_ON();
            SysTick_Delay_Nms(300);
            LED_GRE_OFF();
		 
            effect++;                               // 效果编号递增，切换到下一种效果
      SysTick_Delay_Nms(2000);          // 暂停1秒后再执行下一种效果
            break;

		case 2:      // 交替闪烁：两组LED交替点亮并熄灭
            LED_BLU_ON();
            LED_RED_ON();
            SysTick_Delay_Nms(300);
            LED_BLU_OFF();
            LED_RED_OFF();

            LED_WHI_ON();
            LED_GRE_ON();
            SysTick_Delay_Nms(300);
            LED_WHI_OFF();
            LED_GRE_OFF();
		
            effect++;                              // 效果编号递增，切换到下一种效果
      SysTick_Delay_Nms(2000);             // 暂停1秒后再执行下一种效果
            break;

		case 3:     //全灯闪烁
            LED_BLU_ON();
            LED_RED_ON();
            LED_WHI_ON();
            LED_GRE_ON();
            SysTick_Delay_Nms(300);

            LED_BLU_OFF();
            LED_RED_OFF();
            LED_WHI_OFF();
            LED_GRE_OFF();
            SysTick_Delay_Nms(300);
		
            effect++;                             // 效果编号递增，切换到下一种效果
      SysTick_Delay_Nms(2000);              // 暂停1秒后再执行下一种效果
            break;

		case 4:      //逐渐熄灭
            LED_BLU_ON();
            LED_RED_ON();
            LED_WHI_ON();
            LED_GRE_ON();
            SysTick_Delay_Nms(400);
            
            LED_BLU_OFF();
            SysTick_Delay_Nms(300);
            LED_WHI_OFF();
            SysTick_Delay_Nms(300);
            LED_RED_OFF();
            SysTick_Delay_Nms(300);
            LED_GRE_OFF();
            SysTick_Delay_Nms(300);
		
            effect++;                             // 效果编号递增，切换到下一种效果
      SysTick_Delay_Nms(2000);            // 暂停1秒后再执行下一种效果
            break;

      default: effect = 1; break;                 // 所有效果执行完毕后，重置为第一种效果
	}
}

void LED_Set(uint8_t led_num, uint8_t state) {
	/* 根据state控制对应LED亮灭，注意部分LED为低电平点亮 */
	switch(led_num) {
		case 0: 
			if(state) { LED_BLU_ON(); } else { LED_BLU_OFF(); }       // 控制蓝色LED
			break;
		case 1: 
			if(state) { LED_RED_ON(); } else { LED_RED_OFF(); }       // 控制红色LED
			break;
		case 2: 
			if(state) { LED_GRE_ON(); } else { LED_GRE_OFF(); }       // 控制绿色LED
			break;
		case 3: 
			if(state) { LED_WHI_ON(); } else { LED_WHI_OFF(); }       // 控制白色LED
			break;
		
		default:
			break; // 无效LED编号
	}
	
}

#define LED_T 1000  //LED控制周期，大概1000个延时次数
#define LED_Ton 500   //LED点亮时长

void LED_Task_2(uint8_t led_num, uint8_t freq)
{
	 if(freq > 5) freq = 5;                        // 限制最大频率为5Hz
	
	if(freq == 0) 
	{                      // 0Hz：长亮
    LED_Set(led_num, 1);
  } 
	else 
	{
   uint32_t half_period = 500 / freq;            // 计算半周期（ms），频率=1/(2*半周期)
    LED_Set(led_num, 1);
    SysTick_Delay_Nms(half_period);              // 亮半周期
    LED_Set(led_num, 0);
    SysTick_Delay_Nms(half_period);              // 灭半周期
  }   
}

// 非阻塞任务：基于SysTick 1ms计数，实现单个LED的0-5Hz闪烁（0为长亮）。
// 需在while(1)中高频调用；每个LED各自有独立状态机。
void LED_Task_3(uint8_t led_num, uint8_t freq)
{
	static uint8_t led_state[4] = {0,0,0,0};       // 静态数组：记录4个LED的当前状态
	static uint32_t last_toggle_ms[4] = {0,0,0,0}; // 静态数组：记录每个LED上次状态切换的时间
	uint32_t now = SysTick_Millis();               // 获取当前系统运行的毫秒数

	if(led_num > 3) return;              // 只支持0-3号LED，无效编号直接返回
	if(freq > 5) freq = 5;           // 上限5Hz

	if(freq == 0)
	{
		// 长亮
		LED_Set(led_num, 1);
		led_state[led_num] = 1;
		return;
	}

	uint32_t half_period_ms = 500 / freq; // 计算半周期（ms）
	if(now - last_toggle_ms[led_num] >= half_period_ms)
	{
		led_state[led_num] = !led_state[led_num];        // 翻转LED状态
		LED_Set(led_num, led_state[led_num]);            // 应用新状态
		last_toggle_ms[led_num] = now;               // 更新上次切换时间为当前时间
	}
}

void LED_Task_1bit(uint8_t led_num)
{
	
	// 校验参数：仅允许1~3（1:RED, 2:GRE, 3:WHI）；其它值直接返回
	if(led_num < 1 || led_num > 3) return;
	// 只点亮指定的一个LED，其他全部熄灭
	LED_RED_OFF();
	LED_GRE_OFF();
	LED_WHI_OFF();
	LED_Set(led_num, 1);
	return;

	
}


